package self.xine.basic.thread.other;

import java.util.Random;

import self.xine.basic.thread.entity.SharedObject;

/**
 * 对于多线程，除了管理共享资源。另一种做法，避免多线程区享资源，
 * 	将共享资源，复制成多份，每个线程一份资源。
 *  将多线程转换为单线程一般，避免线程安全问题
 * 
 * 	ThreadLocal 便是用于这种方式，在当前线程中，没有该资源时，便获取一份全新的。
 * 	  它相当于以当前线程的id为key，将资源对象存放进map中。
 * 
 *   它与每次都创建一个新的不同，在同一个线程中，使用的是同一个对象
 * 
 * @author xine
 * @date 2018年9月8日
 */
public class ThreadLocalTest {
	
	public static void main(String[] args) {
		ThreadLocal<SharedObject> threadLocal = new ThreadLocal<SharedObject>();
		
		new MyThread(threadLocal).start();
		new MyThread(threadLocal).start();

	}
	
}

class MyThread extends Thread {
	
	private ThreadLocal<SharedObject> threadLocal;
	
	public MyThread(ThreadLocal<SharedObject> threadLocal) {
		this.threadLocal = threadLocal;
	}
	
	@Override
	public void run() {
		SharedObject sharedObject = threadLocal.get();
		if(sharedObject == null) {
			sharedObject = new SharedObject();
			threadLocal.set(sharedObject);
		}			
		
		int value = new Random().nextInt(10);		
		sharedObject.set(value);
		
		System.out.println(sharedObject.toString() + " "  + value);
		
		test();
	}
	
	public void test() {
		SharedObject sharedObject = threadLocal.get();
		if(sharedObject == null) {
			sharedObject = new SharedObject();
			threadLocal.set(sharedObject);
		}
		
		System.out.println(sharedObject.toString() + " " + sharedObject.getCount());		
		
	}
	
	
}

